home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
2517
/
2517.xpi
/
content
/
script-compiler.js
< prev
next >
Wrap
Text File
|
2009-08-15
|
6KB
|
185 lines
var googlepedia_gmCompiler={
// getUrlContents adapted from Greasemonkey Compiler
// http://www.letitblog.com/code/python/greasemonkey.py.txt
// used under GPL permission
//
// most everything else below based heavily off of Greasemonkey
// http://greasemonkey.mozdev.org/
// used under GPL permission
getUrlContents: function(aUrl){
var ioService=Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var scriptableStream=Components
.classes["@mozilla.org/scriptableinputstream;1"]
.getService(Components.interfaces.nsIScriptableInputStream);
var channel=ioService.newChannel(aUrl, null, null);
var input=channel.open();
scriptableStream.init(input);
var str=scriptableStream.read(input.available());
scriptableStream.close();
input.close();
return str;
},
isGreasemonkeyable: function(url) {
var scheme=Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService)
.extractScheme(url);
return (
(scheme == "http" || scheme == "https" || scheme == "file") &&
!/hiddenWindow\.html$/.test(url)
);
},
contentLoad: function(e) {
var unsafeWin=e.target.defaultView;
if (unsafeWin.wrappedJSObject) unsafeWin=unsafeWin.wrappedJSObject;
var unsafeLoc=new XPCNativeWrapper(unsafeWin, "location").location;
var href=new XPCNativeWrapper(unsafeLoc, "href").href;
if (
googlepedia_gmCompiler.isGreasemonkeyable(href)
&& ( /http:\/\/www\.google\..*\/search.*q=.*/.test(href) )
&& true
) {
var script=googlepedia_gmCompiler.getUrlContents(
'chrome://googlepedia/content/googlepedia.js'
);
googlepedia_gmCompiler.injectScript(script, href, unsafeWin);
}
},
injectScript: function(script, url, unsafeContentWin) {
var sandbox, script, logger, storage, xmlhttpRequester;
var safeWin=new XPCNativeWrapper(unsafeContentWin);
sandbox=new Components.utils.Sandbox(safeWin);
var storage=new googlepedia_ScriptStorage();
xmlhttpRequester=new googlepedia_xmlhttpRequester(
unsafeContentWin, window//appSvc.hiddenDOMWindow
);
var stringsBundle = document.getElementById("string-bundle-googlepedia");
sandbox.window=safeWin;
sandbox.document=sandbox.window.document;
sandbox.unsafeWindow=unsafeContentWin;
// patch missing properties on xpcnw
sandbox.XPathResult=Components.interfaces.nsIDOMXPathResult;
// add our own APIs
sandbox.GM_addStyle=function(css) { googlepedia_gmCompiler.addStyle(sandbox.document, css) };
sandbox.GM_setValue=googlepedia_gmCompiler.hitch(storage, "setValue");
sandbox.GM_getValue=googlepedia_gmCompiler.hitch(storage, "getValue");
sandbox.GM_openInTab=googlepedia_gmCompiler.hitch(this, "openInTab", unsafeContentWin);
sandbox.GM_xmlhttpRequest=googlepedia_gmCompiler.hitch(
xmlhttpRequester, "contentStartRequest"
);
sandbox.getString=function(key){ return stringsBundle.getString(key); };
//unsupported
sandbox.GM_registerMenuCommand=function(){};
sandbox.GM_log=function(){};
sandbox.__proto__=sandbox.window;
try {
this.evalInSandbox(
"(function(){"+script+"})()",
url,
sandbox);
} catch (e) {
var e2=new Error(typeof e=="string" ? e : e.message);
e2.fileName=script.filename;
e2.lineNumber=0;
//GM_logError(e2);
//alert(e2);
}
},
evalInSandbox: function(code, codebase, sandbox) {
if (Components.utils && Components.utils.Sandbox) {
// DP beta+
Components.utils.evalInSandbox(code, sandbox);
} else if (Components.utils && Components.utils.evalInSandbox) {
// DP alphas
Components.utils.evalInSandbox(code, codebase, sandbox);
} else if (Sandbox) {
// 1.0.x
evalInSandbox(code, sandbox, codebase);
} else {
throw new Error("Could not create sandbox.");
}
},
openInTab: function(unsafeContentWin, url) {
var unsafeTop = new XPCNativeWrapper(unsafeContentWin, "top").top;
for (var i = 0; i < this.browserWindows.length; i++) {
this.browserWindows[i].openInTab(unsafeTop, url);
}
},
hitch: function(obj, meth) {
if (!obj[meth]) {
throw "method '" + meth + "' does not exist on object '" + obj + "'";
}
var staticArgs = Array.prototype.splice.call(arguments, 2, arguments.length);
return function() {
// make a copy of staticArgs (don't modify it because it gets reused for
// every invocation).
var args = staticArgs.concat();
// add all the new arguments
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
// invoke the original function with the correct this obj and the combined
// list of static and dynamic arguments.
return obj[meth].apply(obj, args);
};
},
onLoad: function() {
var appcontent=window.document.getElementById("appcontent");
if (appcontent && !appcontent.greased_googlepedia_gmCompiler) {
appcontent.greased_googlepedia_gmCompiler=true;
appcontent.addEventListener("DOMContentLoaded", googlepedia_gmCompiler.contentLoad, false);
}
},
onUnLoad: function() {
//remove now unnecessary listeners
window.removeEventListener('load', googlepedia_gmCompiler.onLoad, false);
window.removeEventListener('unload', googlepedia_gmCompiler.onUnLoad, false);
window.document.getElementById("appcontent")
.removeEventListener("DOMContentLoaded", googlepedia_gmCompiler.contentLoad, false);
}
}; //object googlepedia_gmCompiler
function googlepedia_ScriptStorage() {
this.prefMan=new googlepedia_PrefManager();
}
googlepedia_ScriptStorage.prototype.setValue = function(name, val) {
this.prefMan.setValue(name, val);
}
googlepedia_ScriptStorage.prototype.getValue = function(name, defVal) {
return this.prefMan.getValue(name, defVal);
}
window.addEventListener('load', googlepedia_gmCompiler.onLoad, false);
window.addEventListener('unload', googlepedia_gmCompiler.onUnLoad, false);